//
//  HomeViewController.swift
//  weibo
//
//  Created by 陈勇 on 16/2/22.
//  Copyright © 2016年 chenyong. All rights reserved.
//

import UIKit
import YYModel
import AFNetworking
import SVProgressHUD

/// 微博 Cell 可重用标识符号
private let CZStatusCellID = "CZStatusCellID"
/// 微博提示 Cell 可重用标识符号
private let CZStatusTipCellID = "CZStatusTipCellID"


class HomeViewController: RootViewController {

    override func viewDidLoad() {
        //设置刷新控件
        setupRefreshControl()
        
        // 调用 RootViewController 的 viewDidLoad 函数，会直接调用 loadData
        super.viewDidLoad()
        
        //注册可重用 cell
        prepareTableView()
        
        visitorView?.setupInfo( message: "🐢🐔🐶🐛🦀️")
        // 注册网络连接监听
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged", name: AFNetworkingReachabilityDidChangeNotification, object: nil)
    }
    
    /// 准备表格视图
    private func prepareTableView(){
        
        //注册可重用 cell
        tableView?.registerClass(StatusCell.self, forCellReuseIdentifier: CZStatusCellID)
        tableView?.registerClass(StatusTipCell.self, forCellReuseIdentifier: CZStatusTipCellID)
        
        // 设置行高属性 `尽量准确`
        // 设置预估行高的用处：
        //用数据源行数 * estimatedRowHeiht => contentSize，保证表格能够滚动
        //tableView?.estimatedRowHeight = 200
        //设置行高是自动计算，调用数据源方法的时候，会根据 cell 的布局内容计算行高，动态更改 contentSize 的 height
       // tableView?.rowHeight = UITableViewAutomaticDimension
        
        //取消分隔线
        tableView?.separatorStyle = .None
    }
    
    deinit{
        // 注销通知 - 在控制器被销毁执行。目前的程序，会在应用程序销毁时销毁，可以不写！
        NSNotificationCenter.defaultCenter().removeObserver(
            self,
            name: AFNetworkingReachabilityDidChangeNotification,
            object: nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
        print("Home 的 window \(self.view.window)")
        // 如果视图当前正在显示，window 不为nil
        // 注意：Swift 中 lazy 的属性 ** 千万不要设置成 nil！！！
        if self.view.window == nil{
            //清理数据
            //self.listViewModel.statusList.removeAll()
            //self.listViewModel.cleanup()
            //刷新数据
            self.loadData()
        }
    }
    
    @objc private func reachabilityChanged(){
        // 刷新表格的第一个分组
        self.tableView?.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
    }
    
    /// 加载数据
    override func loadData() {
        
        //判断是否是上拉刷新，如果上拉刷新动画启动，认为是上拉刷新
        let isPullup = refreshControl?.isPullupRefresh ?? false
        
        //显示刷新控件
        refreshControl?.beginRefreshing()
        
        //加载数据
        listViewModel.loadStatus(isPullup){(isSuccessed) -> () in
            
            print("加载数据完成")
            
            // 结束刷新
            self.refreshControl?.endRefreshing()
            
            //判断网络请求是否成功
            if !isSuccessed {
                SVProgressHUD.showInfoWithStatus("您的网络不给力")
                
                return
            }
        
            // 刷新数据
            self.tableView?.reloadData()
        }
}

    private lazy var listViewModel = StatusListViewModel()
}

extension HomeViewController{
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }
    
    //重写数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 分组 0 对应的是提示 cell，如果（网络连接没有）需要提示，才返回 1
        if section == 0{
        
            return NetworkTools.sharedTools.reachable ? 0 : 1
        }
        // 分组 1 对应正常的微博 cell
        return listViewModel.statusList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 分组 0 对应的是提示 cell
        if indexPath.section == 0{
        
            return tableView.dequeueReusableCellWithIdentifier(CZStatusCellID, forIndexPath: indexPath)
        }
        //分组1，对应正常的微博 cell
        let cell = tableView.dequeueReusableCellWithIdentifier(CZStatusCellID, forIndexPath: indexPath) as! StatusCell
        
        // 设置视图模型
        cell.viewModel = listViewModel.statusList[indexPath.row]

        return cell
    }
    
    //返回行高属性
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath:NSIndexPath) ->CGFloat{
        //分组 0 返回默认行高
        if indexPath.section == 0{
        
            return 44
        }
        //返回视图模型的行高属性
        return listViewModel.statusList[indexPath.row].rowHeight
    }

}


